package br.com.jmed.service;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import br.com.jmed.dao.OcorrenciaDao;
import br.com.jmed.dao.Parametros;
import br.com.jmed.dao.ProntuarioDao;
import br.com.jmed.dao.ProntuarioProcedimentoDao;
import br.com.jmed.dao.ProntuarioProcedimentosMateriaisDao;
import br.com.jmed.dao.ProntuarioProcedimentosMedicamentosDao;
import br.com.jmed.dao.ProntuarioProcedimentosMedicosDao;
import br.com.jmed.dao.ProntuarioProcedimentosOutrosProfissionaisDao;
import br.com.jmed.dao.ProntuarioTipoAcomodacaoDao;
import br.com.jmed.dto.MaiorMenorDataDTO;
import br.com.jmed.model.Ocorrencia;
import br.com.jmed.model.Prontuario;
import br.com.jmed.model.ProntuarioProcedimento;
import br.com.jmed.model.ProntuarioProcedimentosMateriai;
import br.com.jmed.model.ProntuarioProcedimentosMedicamento;
import br.com.jmed.model.ProntuarioProcedimentosMedico;
import br.com.jmed.model.ProntuarioProcedimentosOutrosProfissionai;
import br.com.jmed.model.ProntuarioTipoAcomodacao;
import br.com.jmed.model.Usuario;

@Stateless
public class ProntuarioService {

	
	@Inject
	private ProntuarioTipoAcomodacaoDao prontuarioTipoAcomodacaoDao;
	
	@Inject
	private ProntuarioProcedimentoDao prontuarioProcedimentoDao;
	
	@Inject
	private ProntuarioProcedimentosMedicosDao prontuarioProcedimentosMedicosDao;
	
	@Inject
	private ProntuarioProcedimentosOutrosProfissionaisDao prontuarioProcedimentosOutrosProfissionaisDao;
	
	@Inject
	private ProntuarioProcedimentosMedicamentosDao prontuarioProcedimentosMedicamentosDao;
	
	@Inject
	private ProntuarioProcedimentosMateriaisDao prontuarioProcedimentosMateriaisDao;
	
	@Inject
	private ProntuarioDao prontuarioDao;
	
	@Inject
	private OcorrenciaDao ocorrenciaDao;

	public Prontuario findProntuarioByCode(Integer codigo){
		return prontuarioDao.find(Prontuario.class, codigo);
	}
	
	public void encerrarProntuario(Prontuario prontuario){
		MaiorMenorDataDTO maiorMenorDataDTO = prontuarioTipoAcomodacaoDao.buscaMaiorMenorData(prontuario.getCodigo());
		prontuario.setDataEntrada(maiorMenorDataDTO.getMenorData());
		prontuario.setDataSaida(maiorMenorDataDTO.getMaiorData());
		prontuario.setSituacao("E");
		prontuarioDao.merge(prontuario);
	}
	
	public List<ProntuarioTipoAcomodacao> findProntuarioTipoAcomodacao(Integer prontuario){
		Parametros<Integer> parametro = new Parametros<Integer>();
		parametro.setNome("prontuario");
		parametro.setValor(prontuario);
		return prontuarioTipoAcomodacaoDao.findToList("ProntuarioTipoAcomodacao.findByProntuario", parametro);
	}
	
	public List<ProntuarioProcedimento> findProntuarioProcedimento(Integer prontuario){
		Parametros<Integer> parametro = new Parametros<Integer>();
		parametro.setNome("prontuario");
		parametro.setValor(prontuario);
		return prontuarioProcedimentoDao.findToList("ProntuarioProcedimento.findProntuarioProcedimentoByProntuario", parametro);
	}
	
	public List<ProntuarioProcedimentosMedico> findProntuarioProcedimentosMedico(Integer prontuario){
		Parametros<Integer> parametro = new Parametros<Integer>();
		parametro.setNome("prontuario");
		parametro.setValor(prontuario);
		return prontuarioProcedimentosMedicosDao.findToList("ProntuarioProcedimentosMedico.findByProntuario", parametro);
	}
	
	public List<ProntuarioProcedimentosOutrosProfissionai> findProntuarioProcedimentosOutrosProfissionais(Integer prontuario){
		Parametros<Integer> parametro = new Parametros<Integer>();
		parametro.setNome("prontuario");
		parametro.setValor(prontuario);
		return prontuarioProcedimentosOutrosProfissionaisDao.findToList("ProntuarioProcedimentosOutrosProfissionais.findByProntuario", parametro);
	}
	
	public List<Ocorrencia> findProntuarioOcorrencias(Integer prontuario){
		Parametros<Integer> parametro = new Parametros<Integer>();
		parametro.setNome("prontuario");
		parametro.setValor(prontuario);
		return ocorrenciaDao.findToList("Ocorrencia.findByProntuario", parametro);
	}
	
	public List<Prontuario> findProntuarioToIndex(String nomePaciente, Integer codigoConvenio, Date dataInicio, Date dataFim, Usuario usuario){
		
		Parametros<String> nomePacienteParametro = null ;
		Parametros<Date> dataEntradaParametro = null;
		Parametros<Date> dataSaidaParametro = null;
		Parametros<Integer> convenioCodigoParametro = null;
		Parametros<Integer> codigoUsuario = null;
		
		dataEntradaParametro = new Parametros<Date>();
		dataSaidaParametro = new Parametros<Date>();
		codigoUsuario = new Parametros<Integer>();
		nomePacienteParametro = new Parametros<String>();
		convenioCodigoParametro = new Parametros<Integer>();
		
		dataEntradaParametro.setNome("dataInicio");
		dataSaidaParametro.setNome("dataFim");
		codigoUsuario.setNome("codigoUsuario");
		nomePacienteParametro.setNome("nomePaciente");
		convenioCodigoParametro.setNome("codigoConvenio");
		
		if(usuario == null){
			codigoUsuario.setValor(null);
		}else {
			codigoUsuario.setValor(usuario.getCodigo());
		}
		
		if(nomePaciente != null) {
			nomePacienteParametro.setValor(nomePaciente+"%");
		}else {
			nomePacienteParametro.setValor(null);
		}
		
		if(codigoConvenio != null && codigoConvenio != 0){
			convenioCodigoParametro.setValor(codigoConvenio);	
		}else{
			convenioCodigoParametro.setValor(null);
		}
		
		dataEntradaParametro.setValor(dataInicio);
		dataSaidaParametro.setValor(dataFim);
		
		return prontuarioDao.findToList("Prontuario.findToIndex", nomePacienteParametro,dataEntradaParametro,dataSaidaParametro,convenioCodigoParametro,codigoUsuario);
	}
	
	public List<ProntuarioProcedimentosMedicamento> findProntuarioProcedimentosMedicamentos(Integer prontuario){
		Parametros<Integer> parametro = new Parametros<Integer>();
		parametro.setNome("prontuario");
		parametro.setValor(prontuario);
		return prontuarioProcedimentosMedicamentosDao.findToList("ProntuarioProcedimentosMedicamento.findByProntuario", parametro);
	}
	
	public List<ProntuarioProcedimentosMateriai> findProntuarioProcedimentosMateriais(Integer prontuario){
		Parametros<Integer> parametro = new Parametros<Integer>();
		parametro.setNome("prontuario");
		parametro.setValor(prontuario);
		return prontuarioProcedimentosMateriaisDao.findToList("ProntuarioProcedimentosMateriais.findByProntuario", parametro);
	}
	
	public void salvarProntuario(Prontuario prontuario){
		MaiorMenorDataDTO maiorMenorDataDTO = prontuarioTipoAcomodacaoDao.buscaMaiorMenorData(prontuario.getCodigo());
		prontuario.setDataEntrada(maiorMenorDataDTO.getMenorData());
		prontuarioDao.merge(prontuario);
	}
	
	public boolean validaExclusao(ProntuarioProcedimento prontuarioProcedimento){
		
		Long total = prontuarioProcedimentoDao.count("ProntuarioProcedimento.quantidadeFilhos", new Parametros<Integer>("codigo",prontuarioProcedimento.getCodigo()));
		if(total != null && total >0L){
			return false;
		}
		return true;
	}
	
	public Prontuario inserirProntuario(Prontuario prontuario){
		prontuarioDao.save(prontuario);
		return prontuario;
	}
	
	public ProntuarioProcedimento findProntuarioProcedimentoByCode(Integer codigo){
		return prontuarioProcedimentoDao.find(ProntuarioProcedimento.class, codigo);
	}
	
	public void inserirAlterarAcomodacao(ProntuarioTipoAcomodacao prontuarioTipoAcomodacao){
		prontuarioTipoAcomodacaoDao.merge(prontuarioTipoAcomodacao);
	}
	
	public void inserirAlterarOcorrencia(Ocorrencia ocorrencia){
		ocorrenciaDao.merge(ocorrencia);
	}
	
	public void inserirAlterarProcedimento(ProntuarioProcedimento prontuarioProcedimento){
		prontuarioProcedimentoDao.merge(prontuarioProcedimento);
	}
	
	public void inserirAlterarProcedimentosMedicos(ProntuarioProcedimentosMedico prontuarioProcedimentoMedicos){
		prontuarioProcedimentosMedicosDao.merge(prontuarioProcedimentoMedicos);
	}
	
	public void inserirAlterarProcedimentosMedicamentos(ProntuarioProcedimentosMedicamento prontuarioProcedimentosMedicamento){
		prontuarioProcedimentosMedicamentosDao.merge(prontuarioProcedimentosMedicamento);
	}
	
	public void inserirAlterarProcedimentosMateriais(ProntuarioProcedimentosMateriai prontuarioProcedimentosMateriais){
		prontuarioProcedimentosMateriaisDao.merge(prontuarioProcedimentosMateriais);
	}
	
	public void inserirAlterarProcedimentosOutrosProfissionais(ProntuarioProcedimentosOutrosProfissionai prontuarioProcedimentosOutrosProfissionais){
		prontuarioProcedimentosOutrosProfissionaisDao.merge(prontuarioProcedimentosOutrosProfissionais);
	}
	
	public void setProntuarioTipoAcomodacaoDao(
			ProntuarioTipoAcomodacaoDao prontuarioTipoAcomodacaoDao) {
		this.prontuarioTipoAcomodacaoDao = prontuarioTipoAcomodacaoDao;
	}
	
	public void removeProntuarioTipoAcomodacao(ProntuarioTipoAcomodacao prontuarioTipoAcomodacao){
		prontuarioTipoAcomodacaoDao.delete(prontuarioTipoAcomodacao, prontuarioTipoAcomodacao.getCodigo());
	}
	
	public void removeProntuarioMedicos(ProntuarioProcedimentosMedico prontuarioProcedimentosMedico){
		prontuarioProcedimentosMedicosDao.delete(prontuarioProcedimentosMedico, prontuarioProcedimentosMedico.getCodigo());
	}
	
	public void removeProntuarioOutrosParticipantes(ProntuarioProcedimentosOutrosProfissionai prontuarioProcedimentosOutrosProfissionais){
		prontuarioProcedimentosOutrosProfissionaisDao.delete(prontuarioProcedimentosOutrosProfissionais, prontuarioProcedimentosOutrosProfissionais.getCodigo());
	}
	
	public void removeProntuarioMedicamentos(ProntuarioProcedimentosMedicamento prontuarioProcedimentosMedicamento){
		prontuarioProcedimentosMedicamentosDao.delete(prontuarioProcedimentosMedicamento, prontuarioProcedimentosMedicamento.getCodigo());
	}
	
	public void removeProntuarioMateriais(ProntuarioProcedimentosMateriai prontuarioProcedimentosMateriais){
		prontuarioProcedimentosMateriaisDao.delete(prontuarioProcedimentosMateriais, prontuarioProcedimentosMateriais.getCodigo());
	}

	public void removeProntuarioProcedimento(ProntuarioProcedimento prontuarioProcedimento){
		prontuarioProcedimentoDao.delete(prontuarioProcedimento, prontuarioProcedimento.getCodigo());
	}
	
	public void removeOcorrencia(Ocorrencia ocorrencia){
		ocorrenciaDao.delete(ocorrencia, ocorrencia.getCodigo());
	}
	
	public void setProntuarioProcedimentoDao(
			ProntuarioProcedimentoDao prontuarioProcedimentoDao) {
		this.prontuarioProcedimentoDao = prontuarioProcedimentoDao;
	}

	public void setProntuarioProcedimentosMedicosDao(
			ProntuarioProcedimentosMedicosDao prontuarioProcedimentosMedicosDao) {
		this.prontuarioProcedimentosMedicosDao = prontuarioProcedimentosMedicosDao;
	}

	public void setProntuarioProcedimentosOutrosProfissionaisDao(
			ProntuarioProcedimentosOutrosProfissionaisDao prontuarioProcedimentosOutrosProfissionaisDao) {
		this.prontuarioProcedimentosOutrosProfissionaisDao = prontuarioProcedimentosOutrosProfissionaisDao;
	}

	public void setProntuarioProcedimentosMedicamentosDao(
			ProntuarioProcedimentosMedicamentosDao prontuarioProcedimentosMedicamentosDao) {
		this.prontuarioProcedimentosMedicamentosDao = prontuarioProcedimentosMedicamentosDao;
	}

	public void setProntuarioProcedimentosMateriaisDao(
			ProntuarioProcedimentosMateriaisDao prontuarioProcedimentosMateriaisDao) {
		this.prontuarioProcedimentosMateriaisDao = prontuarioProcedimentosMateriaisDao;
	}

	public void setProntuarioDao(ProntuarioDao prontuarioDao) {
		this.prontuarioDao = prontuarioDao;
	}

	public void setOcorrenciaDao(OcorrenciaDao ocorrenciaDao) {
		this.ocorrenciaDao = ocorrenciaDao;
	}
	
	
	
}
